/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package muhnes.sizoo.dal;

import muhnes.sizoo.HibernateUtilSeguridad;
import muhnes.sizoo.modelo.Privilegio;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;

/**
 * Clase que implementa los metodos declarados en su interfaz privilegioDao
 * 
 * @author Nelson Chicas
 */
public class PrivilegioDaoImpl extends GenericoDAO< Privilegio, Integer > 
                               implements PrivilegioDao {
    
    public PrivilegioDaoImpl() {
        super( HibernateUtilSeguridad.getSessionFactory() );
    }
    
    @Override
    protected Class<?> getClaseEntidad () {
        return Privilegio.class;
    }

    /**
     * Metodo que realiza las busquedas de la entidad por nombre
     * @param nombre string que contiene el nombre de parametro
     * @return la entidad con todos sus atributos
     */
    @Override
    public Privilegio buscarPorNombre(String nombre) {
        Session sesion = fabricaSesion.getCurrentSession();
        Query consulta = sesion.createQuery("from Privilegio where nombre = :nombre");
        consulta.setParameter("nombre", nombre);
        Privilegio privilegio = (Privilegio)consulta.uniqueResult();
        return privilegio;
    }
    
    /**
     * metodo que busca los componentes de la operacion y del objeto para verificar
     * que no existan previamente 
     * @param idOperacion de tipo entero que indica el id de la operacion
     * @param idObjeto de tipo entero que indica el id del objeto
     * @return un objeto con la entidad
     */
    @Override
    public Privilegio buscarPorComponentes(int idOperacion, int idObjeto) {
        Session sesion = fabricaSesion.getCurrentSession();
        String hql = "from Privilegio where codigooperacion = :operacion " +
                     "and codigoobjeto = :objeto";
        Query consulta = sesion.createQuery(hql);
        consulta.setParameter("operacion", idOperacion);
        consulta.setParameter("objeto", idObjeto);
        Privilegio privilegio = (Privilegio)consulta.uniqueResult();
        return privilegio;
    }
    
    /**
     * Metodo para buscar el componente por nombre de la operacion y del objeto
     * @param nombreOperacion string que contiene el nombre de la operacion
     * @param nombreObjeto string que contiene el nombre del objeto
     * @return devuelve la entidad y sus atributos
     */
    @Override
    public Privilegio buscarPorComponentes(String nombreOperacion, String nombreObjeto) {
        Session sesion = fabricaSesion.getCurrentSession();
        String hql = "select p " +
                     "from Privilegio as p, Operacion as op, Objeto as ob " +
                     "where op.nombre = :operacion " +
                     "and ob.nombre = :objeto " +
                     "and p.operacion.codigooperacion = op.codigooperacion " +
                     "and p.objeto.codigoobjeto = ob.codigoobjeto";
        Query consulta = sesion.createQuery(hql);
        consulta.setParameter("operacion", nombreOperacion);
        consulta.setParameter("objeto", nombreObjeto);
        Privilegio privilegio = (Privilegio)consulta.uniqueResult();
        return privilegio;
    }

    /**
     * Verifica la unicidad de la entidad
     * @param privilegio entidad que es la que se analizara
     * @return boolean que indica si existe o no
     */
    @Override
    public boolean verificarUnicidad(Privilegio privilegio) {
        Session sesion = fabricaSesion.getCurrentSession();        
        String hql = "from Privilegio where codigoprivilegio != :codigo " + 
                     "and (upper(nombre) = :nombre " +
                     "or (codigooperacion = :operacion " +
                     "and codigoobjeto = :objeto))";
        Query consulta = sesion.createQuery( hql );
        consulta.setParameter("codigo", privilegio.getCodigoprivilegio());
        consulta.setParameter("nombre", privilegio.getNombre().toUpperCase());
        consulta.setParameter("operacion", privilegio.getOperacion().getCodigooperacion());
        consulta.setParameter("objeto", privilegio.getObjeto().getCodigoobjeto());
        return consulta.uniqueResult() != null ? true : false;
    }
    
    /**
     * Metodo para verificar si la entidad tiene dependencias con su tabla padre
     * @param entidad que se verificara la dependencia
     * @return  un objeto de tipo boolean que indica si esta depende o no de otra tabla
     */
    @Override
    public boolean verificarDependencia (Privilegio entidad) {
        Session sesion = fabricaSesion.getCurrentSession();        
        String hql = "from Privilegio where codigoprivilegio = :codigo " +
                     "and size(roles) > 0";
        Query consulta = sesion.createQuery( hql );
        consulta.setParameter("codigo",entidad.getCodigoprivilegio());
        return !consulta.list().isEmpty();
    }

}
